package com.itheima.d3_annotation;


/**
 * 注解概述、作用，自定义注解
 *
 * Java 注解（Annotation）又称 Java 标注，是 JDK5.0 引入的一种注释机制。
 * 注解就是Java代码里的特殊标记，比如@Override，@Test等，作用是：让其他的程序根据注解信息来决定怎么执行该程序
 * Java 语言中的类、构造器、方法、成员变量、参数等都可以被注解进行标注。
 *
 * 注解的作用是什么呢？
 * 对Java中类、方法、成员变量做标记，然后进行特殊处理，至于到底做何种处理由业务需求来决定。
 * 例如：JUnit框架中，标记了注解@Test的方法就可以被当成测试方法执行，而没有标记的就不能当成测试方法执行。
 *
 * 自定义注解 ：自定义注解就是自己做一个注解来使用。
 * 格式：
 * public @interface 注解名称 {
 * public 属性类型 属性名() default 默认值 ;
 * }
 * 这里面的属性类型：Java支持的数据类型基本上都支持
 *
 * 特殊属性
 * value属性，如果只有一个value属性的情况下，使用value属性的时候可以省略value名称不写!!
 * 但是如果有多个属性,  且多个属性没有默认值，那么value名称是不能省略的。
 */
/*
执行完main方法后会编译成class文件，然后把class文件用软件xjad进行反编译。
这部分内容ppt没有，视频里的磊哥讲了，并且有不同的ppt
MyTest1注解反编译的结果如下：
public interface MyTest1 extends Annotation
{public abstract String aaa();
public abstract boolean bbb();
public abstract String[] ccc();}

注解的本质是个接口，注解里面的属性实际上都是一些抽象方法的形式，Java中所有注解都是继承Annotation接口
使用@注解（...）：其实就是一个实现类对象，实现了该注解以及Annotation接口

@MyTest1(aaa="牛魔王", ccc={"HTML", "Java"})  这一坨的本质是一个注解的实现类对象，所以相当于在创建一个实现类的对象，
这个实现的类对象会封装注解的这些属性信息
 */

//注解该怎么用呢：要加上一个@，写完就可以标记这个类了，自定义的注解里面有属性，一定要填，有默认值的属性可以不填
@MyTest1(aaa="牛魔王", ccc={"HTML", "Java"})
// @MyTest2(value = "孙悟空")  //value属性，如果只有一个value属性的情况下，使用value属性的时候可以省略value名称不写!!
//@MyTest2("孙悟空")
//@MyTest2(value = "孙悟空", age = 1000)
@MyTest2("孙悟空")
public class AnnotationTest1 {
    @MyTest1(aaa="铁扇公主", bbb=false, ccc={"Python", "前端", "Java"})
    public void test1(){

    }

    public static void main(String[] args) {

    }
}
